草庐IT

C++ double 到 long long

全部标签

c++ - 对本周大师的理解 #67 : Double or Nothing

最近,我正在阅读帖子:DoubleorNothingfromGOTWbyHerbSutter我对以下程序的解释有点困惑:intmain(){doublex=1e8;while(x>0){--x;}}假设这段代码在某台机器上运行1秒。我同意这样的代码很愚蠢的观点。但是,根据问题的解释,如果我们将x从float更改为double,那么在某些编译器上,它将保留计算机运行到永远。解释基于标准中的以下引用。引自C++标准第3.9.1/8节:Therearethreefloatingpointtypes:float,double,andlongdouble.Thetypedoubleprovide

c++ - strtoull() 的输出在转换为 double 然后返回 uint64_t 时失去精度

考虑以下几点:#include#includeintmain(){std::cout打印:0xffffffffffffffff0x00xffffffffffffffff第一个数字只是转换ULLONG_MAX的结果,从字符串到uint64_t,按预期工作。但是,如果我将结果转换为double然后回到uint64_t,然后打印0,第二个数字。通常,我会把这归因于float的精度不准确,但更让我困惑的是,如果我转换ULLONG_MAX来自uint64_t至double然后回到uint64_t,结果是正确的(第三个数字)。为什么第二个和第三个结果不一样?编辑(@RadoslawCybulski

c++ - 将 float 转换为 double

将float转换为double的代价是多少?它是否像int到long的转换一样微不足道?编辑:我假设一个平台,其中float是4个字节,double是8个字节 最佳答案 平台注意事项这取决于用于float计算的平台。对于x87FPU,转换是免费的,因为寄存器内容是相同的——您有时可能付出的唯一代价是内存流量,但在许多情况下甚至没有流量,因为您可以简单地使用该值而无需任何转换。x87在这方面实际上是一个奇怪的野兽-很难正确区分float和double,因为使用的指令和寄存器是相同的,不同的是加载/存储指令和计算精度本身是使用状态位控制

c++ - 如何将分数纪元时间戳( double )转换为 std::chrono::time_point?

我有一个小数纪元时间戳,表示为double,我想将其转换为适当的std::chrono::time_point。纪元是自1/1/1970以来的常用UNIX纪元。我知道存在std::chrono::system_clock::from_time_t,但是time_t没有小数部分。使用C++11方法执行此操作的最佳方法是什么?这个问题与unixtimestamptoboost::posix_time::ptime有关,除了它要求的是C++11而不是它的Boost版本。 最佳答案 假设纪元与已知的时钟类型相同,您可以使用具有double表

c++ - C++11 类型推断如何决定 float 或 double ?

考虑这个类型推断的例子:autovar=1.0;在C++11类型推断下,它的计算结果是float还是double?可以控制这种行为吗? 最佳答案 它将被评估为double是的,您可以控制它。在标准ISO-14882:2011中,2.14.4float文字,第1点:Thetypeofafloatingliteralisdoubleunlessexplicitlyspecifiedbyasuffix.ThesuffixesfandFspecifyfloat,thesuffixeslandLspecifylongdouble.Ifthes

c++ - 比 double 更精确的 float 据类型?

在我的项目中,我必须计算double元素矩阵的除法、乘法、减法和加法。问题是,当矩阵的大小增加时,我的输出精度会受到极大影响。目前,我对每个元素使用double,我认为它使用8字节的内存并且具有16位的精度,无论小数点位置如何。即使对于大尺寸矩阵,所有元素占用的内存也在几千字节的范围内。所以我可以负担得起使用需要更多内存的datatypes。所以我想知道哪种数据类型比double更精确。我试着在一些书中搜索,我可以找到longdouble。但我不知道它的精度是多少。如果我想要比这更高的精度怎么办? 最佳答案 根据维基百科,80位“I

c++ - 精确为零的 float / double 相等

我有一个算法,它使用floats或doubles来执行一些计算。例子:doublea;doubleb;doublec;...doubleresult=c/(b-a);if((result>0)&&(result现在,我担心(b-a)可能为零。如果它接近于零但不为零,那没关系,因为result将超出有用范围,而且我已经检测到(如(b-a)接近零,result将接近+/-inf,这不在范围0-small_number...)但是如果(b-a)的结果恰好为零,我预计由于被零除会发生一些依赖于平台的事情。我可以将if语句更改为:if((!((b-a)==0.0))&&((result=c/(b

c++ - 将 double 分配给 const int& vs int 分配给 const int&

这个问题在这里已经有了答案:TemporaryinitializationandReferenceinitialization(3个答案)关闭4个月前。我试图理解C++中的常量引用,但我偶然发现了这个问题:当我将double分配给constint&然后更改引用double的值时,我的int引用的值保持不变。doublei=10;constint&ref=i;i=20;cout而在分配int时,值会发生变化。inti=10;constint&ref=i;i=20;cout这种行为的原因是什么?我的猜测是,在分配double时,隐式转换为int创建了一个新对象,然后分配了它的引用,但是我找

c++ - std:numeric_limits<double>::epsilon 定义

numeric_limits::espilon返回1和下一个double之间的差值。那么,我是否应该理解两个相邻double之间的距离并不总是相同,例如2和下一个double之间的距离?如果是,我可以解释一下吗? 最佳答案 随着离零越来越远,float的“密度”会很多。这是因为IEEEfloat本质上是以科学记数法存储的,因此范围优于统一精度。(如果是统一精度,那就是定点数,不是float。)换句话说,数字以Significand*2exponent的形式存储,因此如果指数变大,则significand的微小变化会导致数字(反之亦然

c++ - 将 std::vector<boost::optional<double>> 转换为 std::vector<double>

我有一个std::vector>,foo说。在这个特定的例子中,我需要一个std::vector其他vector中的任何“可选”元素映射到新vector中的0。我是否缺少针对此问题的单线解决方案?另一种选择是不尽如人意std::vectorout(foo.size());for(auto&it:foo){out.push_back(it?*it:0.0);}我欢迎基于std::optional的解决方案,即使我还没有使用该标准。 最佳答案 std::transform解决方案:std::vectorout(foo.size());s